/*
 * Copyright 2011-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0.
 * See `LICENSE` in the project root for license information.
 */

package me.ijleex.mgmt.codegen.entity;

import org.apache.ibatis.type.Alias;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.base.MoreObjects;

import me.ijleex.mgmt.framework.entity.EntitySupport;

/**
 * 数据库表的列的信息（information_schema.columns）
 *
 * <p>https://dev.mysql.com/doc/refman/8.0/en/columns-table.html</p>
 *
 * @author liym
 * @since 2019-02-22 11:36 新建
 */
@Alias("ColumnInfo")
public class ColumnInfo extends EntitySupport {

    /**
     * 数据库名
     */
    private String tableSchema;
    /**
     * 数据表名
     */
    private String tableName;
    /**
     * 表格字段名称（如 mobile_no）
     */
    private String columnName;
    /**
     * 该列在表中的排序位置
     *
     * <p>用于排序（ORDER BY ordinal_position），因为从 information_schema.columns 中查询的数据没有自动排序</p>
     */
    private Integer ordinalPosition;
    /**
     * 字段默认值
     */
    private String columnDefault;
    /**
     * 是否允许为空（Null；YES/NO）
     */
    private String isNullable;
    /**
     * 数据类型（如 varchar）
     */
    private String dataType;
    /**
     * 列类型（数据类型、长度、是否无符号等；如 bigint(19) unsigned）
     */
    private String columnType;
    /**
     * 列的约束条件：PRI-主键约束、UNI-唯一约束、MUL-可以重复
     */
    private String columnKey;
    /**
     * 执行计划（包含了与索引相关的一些细节信息；如 auto_increment）
     */
    private String extra;
    /**
     * 列描述（注释信息）
     */
    private String columnComment;

    // -------------------- 代码生成参数 --------------------

    /**
     * Java 字段名称（第一个字母小写），如：mobile_no -> mobileNo
     */
    @JsonIgnore
    private String fieldName;
    /**
     * Java 字段 `大驼峰法` 名称（第一个字母大写），如：mobile_no -> MobileNo
     */
    @JsonIgnore
    private String fieldCapsName;
    /**
     * Java 字段类型（如 java.lang.String）
     */
    @JsonIgnore
    private String fieldType;

    public String getTableSchema() {
        return this.tableSchema;
    }

    public void setTableSchema(String tableSchema) {
        this.tableSchema = tableSchema;
    }

    public String getTableName() {
        return this.tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getColumnName() {
        return this.columnName;
    }

    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    public Integer getOrdinalPosition() {
        return this.ordinalPosition;
    }

    public void setOrdinalPosition(Integer ordinalPosition) {
        this.ordinalPosition = ordinalPosition;
    }

    public String getColumnDefault() {
        return this.columnDefault;
    }

    public void setColumnDefault(String columnDefault) {
        this.columnDefault = columnDefault;
    }

    public String getIsNullable() {
        return this.isNullable;
    }

    public void setIsNullable(String isNullable) {
        this.isNullable = isNullable;
    }

    public String getDataType() {
        return this.dataType;
    }

    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    public String getColumnType() {
        return this.columnType;
    }

    public void setColumnType(String columnType) {
        this.columnType = columnType;
    }

    public String getColumnKey() {
        return this.columnKey;
    }

    public void setColumnKey(String columnKey) {
        this.columnKey = columnKey;
    }

    public String getExtra() {
        return this.extra;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }

    public String getColumnComment() {
        return this.columnComment;
    }

    public void setColumnComment(String columnComment) {
        this.columnComment = columnComment;
    }

    public String getFieldName() {
        return this.fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldCapsName() {
        return this.fieldCapsName;
    }

    public void setFieldCapsName(String fieldCapsName) {
        this.fieldCapsName = fieldCapsName;
    }

    public String getFieldType() {
        return this.fieldType;
    }

    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("columnName", this.columnName)
                .add("columnComment", this.columnComment)
                .toString();
    }

}
